﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CommonTools;
using System.Data.SqlClient;
using System.Data;

namespace shop.Model
{
    public static class NumberHelper
    {
        /// <summary>
        /// 根据单据对应ID获取最大编号
        /// </summary>
        /// <param name="tableID">两位的数字</param>
        /// <returns></returns>
        public static string GetNumberByTableId(string tableID)
        {
            //            var sql = @"DECLARE @rq CHAR(8), @NewNumber VARCHAR(12) ;
            //SET @rq=@bj+CONVERT(CHAR(6),GETDATE(),12);

            //----更新编号  赋值@NEW_ID
            //UPDATE JNumberingValue 
            //SET  RuleNumber=(CASE WHEN LEFT(RuleNumber,8)=@rq THEN
            //			@rq+REPLICATE('0', 4 - LEN((CONVERT(INT, RIGHT(RuleNumber, 4)) + 1)))+CONVERT(VARCHAR, (CONVERT(INT, RIGHT(RuleNumber, 4)) + 1))
            //		ELSE
            //			(@rq+'0001')
            //		END ) ,

            //	@NewNumber=(CASE WHEN LEFT(RuleNumber,8)=@rq THEN
            //			@rq+REPLICATE('0', 4 - LEN((CONVERT(INT, RIGHT(RuleNumber, 4)) + 1)))+CONVERT(VARCHAR, (CONVERT(INT, RIGHT(RuleNumber, 4)) + 1))
            //		ELSE
            //			(@rq+'0001')
            //		END ) 
            //WHERE ( TableID=@bj);

            //select @NewNumber as num ;";

            string maxNum = null;

            DB.FSql.Transaction(() =>
            {
                var num = DB.FSql.Select<JNumberingValue>()
                 .Where(a => a.TableID == tableID)
                 .ToOne();


                //编号前缀 8位长度
                string str = tableID + DB.FSql.GetTime().ToString("yyyyMMdd").Substring(2);
                if (num?.RuleNumber?.Substring(0, 8) == str)
                {
                    maxNum = str + Convert.ToInt32(num.RuleNumber.Substring(num.RuleNumber.Length - 4)).ToString().PadLeft(4, '0');
                }
                else
                {
                    maxNum = str + "0001";
                }

                if (num == null)
                {
                    num = new JNumberingValue() { TableID = tableID, RuleNumber = maxNum, AutoNumber = 0, };
                    DB.FSql.Insert(num).ExecuteAffrows();
                }
                else
                {

                    DB.FSql.Update<JNumberingValue>()
                        .Set(a => a.RuleNumber, maxNum)
                        .Where(a => a.TableID == tableID)
                        .ExecuteAffrows();
                }

            });

            return maxNum;



            //            var pr = new[]
            //            {
            //                new SqlParameter("@bj", tableID),
            //            };

            //            var res = DB.FSql.Ado.ExecuteScalar(System.Data.CommandType.Text, sql, pr);

            //            if (res == null || res == DBNull.Value || res.IsNull() == "")
            //            {
            //                //新增一个编号行 
            //                var cmd = @"INSERT INTO dbo.JNumberingValue ( AutoNumber, RuleNumber, TableID, TableName, Table_cn )
            //VALUES  ( 0,  '',   @bj,   @bj,  ''  )";


            //                var pr1 = new SqlParameter("@bj", tableID);
            //                DB.FSql.Ado.ExecuteNonQuery(System.Data.CommandType.Text, cmd, pr1);


            //                //重新获取编号
            //                res = DB.FSql.Ado.ExecuteScalar(System.Data.CommandType.Text, sql, pr);
            //                if (res == null || res == DBNull.Value || string.IsNullOrEmpty( res.ToString()))
            //                {
            //                    return string.Empty;
            //                }
            //                else
            //                {
            //                    return res.ToString();   //返回
            //                }

            //            }
            //            else
            //            {
            //                return res.ToString();  //返回
            //            }

        }




        /// <summary> 获取最大的int类型编号 </summary>
        public static string GetMaxIntNum(string name)
        {

            var res = DB.FSql.Update<JNumberingValue>()
                .Where(a => a.TableName == name)
                .Set(a => a.AutoNumber + 1)
                .ExecuteUpdated();

            if (res?.Any() != true)
            {
                DB.FSql.Insert(new JNumberingValue() { TableName = name, AutoNumber = 1 }).ExecuteAffrows();
                return "1";
            }
            else
            {
                return res.FirstOrDefault().AutoNumber?.ToString();
            }



//            var sql = @"DECLARE @num INT 

//	UPDATE dbo.JNumberingValue
//	SET AutoNumber= (ISNULL(AutoNumber,0)+1),  @num= (ISNULL(AutoNumber,0)+1)
//	WHERE (TableName= @TableName); 

//	SELECT @num as n";

//            var pr = new[]
//            {
//                new SqlParameter("@TableName", name),
//            };

//            var res = DB.FSql.Ado.ExecuteScalar(System.Data.CommandType.Text, sql, pr);

//            if (res == null || res == DBNull.Value || res.IsNull(0) ==0)
//            {
//                //新增一个编号行 
//                //                var cmd = @"INSERT INTO dbo.JNumberingValue ( AutoNumber, RuleNumber, TableID, TableName,
//                //  Table_cn, TableType, MonthRome, NumberLength )
//                //VALUES  ( 0,  '',   '',   @name,  @name,   N'',    N'',   0  )";

//                var cmd = @"INSERT INTO dbo.JNumberingValue ( AutoNumber, RuleNumber, TableID, TableName, Table_cn)
//VALUES  ( 0,  '',   '',   @name,  @name  )";

//                var pr1 = new SqlParameter("@name", name);
//                DB.FSql.Ado.ExecuteNonQuery(System.Data.CommandType.Text, cmd, pr1);


//                //重新获取编号
//                res = DB.FSql.Ado.ExecuteScalar(System.Data.CommandType.Text, sql, pr);
//                if (res == null || res == DBNull.Value || res.IsNull(0) == 0)
//                {
//                    return string.Empty;
//                }
//                else
//                {
//                    return res.ToString();   //返回
//                }

//            }
//            else
//            {
//                return res.ToString();  //返回
//            }

        }






    }
}
